From: Konrad Rzeszutek Wilk Date: Mon, 30 Mar 2015 14:46:38 +0000 (-0400) Subject: libxc: Introduce xc_domain_nr_gpfns as a cousin of xc_domain_maximum_gpfn. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~3505 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=71cba2a07bb541f25390cdd3546c9ee296a7257b;p=xen.git libxc: Introduce xc_domain_nr_gpfns as a cousin of xc_domain_maximum_gpfn. The commit a8f8a590e02d2d2b717257c0bd9a8b396103bdf4 "libxc: Check xc_domain_maximum_gpfn for negative return values" introduced an regression in tools outside libxc (migrate v2) which wanted the unfiltered GPFN value. Said commit added a wrapper which added +1 if there were no errors. To make it work pre-commit a8f8a59 we add an xc_domain_nr_gpfns which will add +1 if there are no errors (and change all in-tree callers to use it). The xc_domain_maximum_gpfn will return the unfiltered GPFN value. Suggested-by: Ian Campbell Reported-by: Andrew Cooper Signed-off-by: Konrad Rzeszutek Wilk Reviewed-by: Andrew Cooper Acked-by: Ian Campbell --- diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 4e9537eb48..552ace8f19 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -1317,6 +1317,8 @@ int xc_domain_disable_migrate(xc_interface *xch, uint32_t domid); int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid, xen_pfn_t *gpfns); +int xc_domain_nr_gpfns(xc_interface *xch, domid_t domid, xen_pfn_t *gpfns); + int xc_domain_increase_reservation(xc_interface *xch, uint32_t domid, unsigned long nr_extents, diff --git a/tools/libxc/xc_core_arm.c b/tools/libxc/xc_core_arm.c index c3f5868044..57d4715636 100644 --- a/tools/libxc/xc_core_arm.c +++ b/tools/libxc/xc_core_arm.c @@ -45,7 +45,7 @@ xc_core_arch_memory_map_get(xc_interface *xch, struct xc_core_arch_context *unus xen_pfn_t p2m_size = 0; xc_core_memory_map_t *map; - if ( xc_domain_maximum_gpfn(xch, info->domid, &p2m_size) < 0 ) + if ( xc_domain_nr_gpfns(xch, info->domid, &p2m_size) < 0 ) return -1; map = malloc(sizeof(*map)); diff --git a/tools/libxc/xc_core_x86.c b/tools/libxc/xc_core_x86.c index 4552e432b3..93ebcbbc4d 100644 --- a/tools/libxc/xc_core_x86.c +++ b/tools/libxc/xc_core_x86.c @@ -50,7 +50,7 @@ xc_core_arch_memory_map_get(xc_interface *xch, struct xc_core_arch_context *unus xen_pfn_t p2m_size = 0; xc_core_memory_map_t *map; - if ( xc_domain_maximum_gpfn(xch, info->domid, &p2m_size) < 0 ) + if ( xc_domain_nr_gpfns(xch, info->domid, &p2m_size) < 0 ) return -1; map = malloc(sizeof(*map)); @@ -85,7 +85,7 @@ xc_core_arch_map_p2m_rw(xc_interface *xch, struct domain_info_context *dinfo, xc int err; int i; - if ( xc_domain_maximum_gpfn(xch, info->domid, &dinfo->p2m_size) < 0 ) + if ( xc_domain_nr_gpfns(xch, info->domid, &dinfo->p2m_size) < 0 ) { ERROR("Could not get maximum GPFN!"); goto out; @@ -212,7 +212,7 @@ int xc_core_arch_get_scratch_gpfn(xc_interface *xch, domid_t domid, xen_pfn_t *gpfn) { - return xc_domain_maximum_gpfn(xch, domid, gpfn); + return xc_domain_nr_gpfns(xch, domid, gpfn); } /* diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index da88e08fd2..dc62eff35e 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -795,12 +795,22 @@ int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid, xen_pfn_t *gpfns) if ( rc >= 0 ) { - *gpfns = rc + 1; + *gpfns = rc; rc = 0; } return rc; } +int xc_domain_nr_gpfns(xc_interface *xch, domid_t domid, xen_pfn_t *gpfns) +{ + int rc = xc_domain_maximum_gpfn(xch, domid, gpfns); + + if ( rc >= 0 ) + *gpfns += 1; + + return rc; +} + int xc_domain_increase_reservation(xc_interface *xch, uint32_t domid, unsigned long nr_extents, diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c index b611c07524..cef6995cce 100644 --- a/tools/libxc/xc_domain_save.c +++ b/tools/libxc/xc_domain_save.c @@ -939,7 +939,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter } /* Get the size of the P2M table */ - if ( xc_domain_maximum_gpfn(xch, dom, &dinfo->p2m_size) < 0 ) + if ( xc_domain_nr_gpfns(xch, dom, &dinfo->p2m_size) < 0 ) { ERROR("Could not get maximum GPFN!"); goto out;